package tt.dz.egobus.servicemanager.base.dao;

import tt.dz.egobus.base.dao.BaseDao;
import tt.dz.egobus.base.entity.BaseEntity;
import tt.dz.egobus.bean.CriteriaRestrictionsBuilder;
import tt.dz.egobus.servicemanager.bean.PagingationStart;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author Anson
 * @date 17-3-14
 * @name 基本Dao的扩展
 * @since 1.0.1
 */
public interface ExtendDao<E extends BaseEntity, PK extends Serializable> extends BaseDao<E,PK> {

    /**
     * 查询列表
     * @param params 带有查询匹配模式查询Key的参数集合
     * <br>其中params中的k为查询的操作以及属性的组合，v当前的值
     * <p>
     * 具体业务实现{@link CriteriaRestrictionsBuilder.QueryRestrictionSymbol#getOpQueryRestriction(String)}
     * <p>
     * 例如：key举例
     * <table>
     *     <tr>
     *         <th>示例</th>
     *         <th>说明</th>
     *     </tr>
     *     <tr>
     *         <td>eq#anson</td>
     *         <td>过滤 值 等于 anson </td>
     *     </tr>
     *     <tr>
     *         <td>like#anson</td>
     *         <td>过滤 值 前后模糊查询 anson </td>
     *     </tr>
     * </table>
     * @return
     */
    List<E> list(Map<String,Object> params);

    /**
     * 查询列表，带有排序规则
     * @param params 带有查询匹配模式查询Key的参数集合
     * @param orders 排序规则
     * <br>其中params中的k为查询的操作以及属性的组合，v当前的值
     * <p>
     * 具体业务实现{@link CriteriaRestrictionsBuilder.QueryRestrictionSymbol#getOpQueryRestriction(String)}
     * <p>
     * 例如：key举例
     * <table>
     *     <tr>
     *         <th>示例</th>
     *         <th>说明</th>
     *     </tr>
     *     <tr>
     *         <td>eq#anson</td>
     *         <td>过滤 值 等于 anson </td>
     *     </tr>
     *     <tr>
     *         <td>like#anson</td>
     *         <td>过滤 值 前后模糊查询 anson </td>
     *     </tr>
     * </table>
     * @return
     */
    List<E> list(Map<String,Object> params ,List<String> orders);

    /**
     * 查询数量
     * @param params 带有查询匹配模式查询Key的参数集合
     * <br>其中params中的k为查询的操作以及属性的组合，v当前的值
     * <p>
     * 具体业务实现{@link CriteriaRestrictionsBuilder.QueryRestrictionSymbol#getOpQueryRestriction(String)}
     * <p>
     * 例如：key举例
     * <table>
     *     <tr>
     *         <th>示例</th>
     *         <th>说明</th>
     *     </tr>
     *     <tr>
     *         <td>eq#anson</td>
     *         <td>过滤 值 等于 anson </td>
     *     </tr>
     *     <tr>
     *         <td>like#anson</td>
     *         <td>过滤 值 前后模糊查询 anson </td>
     *     </tr>
     * </table>
     * @return
     */
    int count(Map<String,Object> params);

    /**
     *
     * @param ids 逐渐即可
     * @author Anson
     * @date 17-3-15
     * @name 根据id集合查询集合
     * @since 1.0.1
     *
     */
    List<E> queryByIds(PK[] ids);

    /**
     *
     * @author Anson
     * @date 17-3-21
     * @name 获取数据库时间
     * @since 1.0.2
     *
     */
    Date getDbDate();

    /**
     * 给予QBC查询
     * <br>查询当前实体的分页功能实现
     * <br>天价了排序功能
     * <br>其中params中的k为查询的操作以及属性的组合，v当前的值
     * <p>
     * 具体业务实现{@link CriteriaRestrictionsBuilder.QueryRestrictionSymbol#getOpQueryRestriction(String)}
     * <p>
     * 例如：key举例
     * <table>
     *  <tr>
     *      <th>示例</th>
     *      <th>说明</th>
     *  </tr>
     *  <tr>
     *      <td>eq#anson</td>
     *      <td>过滤 值 等于 anson </td>
     *  </tr>
     *  <tr>
     *      <td>like#anson</td>
     *      <td>过滤 值 前后模糊查询 anson </td>
     *  </tr>
     * </table>
     *
     * @param params    当前类中查询的参数，非分页信息的参数
     * @param start     当前从第几个数据开始查询
     * @param maxResult 查询的条数
     * @author Anson
     * @date 17-4-13
     * @name
     * @since 1.0.4
     */
    PagingationStart<E> paginationStart(Map<String, Object> params, int start, int maxResult, int maxResult1);

    /**
     * 给予QBC查询
     * <br>查询当前实体的分页功能实现
     * <br>天价了排序功能
     * <br>其中params中的k为查询的操作以及属性的组合，v当前的值
     * <p>
     * 具体业务实现{@link CriteriaRestrictionsBuilder.QueryRestrictionSymbol#getOpQueryRestriction(String)}
     * <p>
     * 例如：key举例
     * <table>
     *  <tr>
     *      <th>示例</th>
     *      <th>说明</th>
     *  </tr>
     *  <tr>
     *      <td>eq#anson</td>
     *      <td>过滤 值 等于 anson </td>
     *  </tr>
     *  <tr>
     *      <td>like#anson</td>
     *      <td>过滤 值 前后模糊查询 anson </td>
     *  </tr>
     * </table>
     *
     * @param params            当前类中查询的参数，非分页信息的参数
     * @param start             当前从第几个数据开始查询
     * @param maxResult         查询的条数
     * @param orderPropertyList 排序字段
     * @author Anson
     * @date 17-4-13
     * @name
     * @since 1.0.4
     */
    PagingationStart<E> paginationStart(Map<String, Object> params, int start, int maxResult,
                                        List<String> orderPropertyList);

}
